package Algorithm.Sort;


public class BubbleSort {
    public static void main(String[] args) {
        int[] arr = {2, 6, 9, 8, 7, 26, 13, 42, 36, 99};
        printArray(arr);
        function2(arr);
        printArray(arr);

    }

    //原始版冒泡排序，有缺陷。
    //假设有N个数字，那么应该排序N-1趟，假设现在排序了n<N趟了，已经有序了，但是它还会继续对已经排序好的数组排序，浪费了。
    public static void function1(int[] arr) {
        //这一层循环表示一共要遍历n-1趟
        for (int i = arr.length - 1; i > 0; i--) {
            //这一层表示，每一轮排序之后就会确定一个数的最终位置，所以只需要排序前i个
            for (int j = 0; j < i; j++) {
                if (arr[j] > arr[j + 1]) {
                    int temp;
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
    }

    //这是原始冒泡的改进，添加了标志位，如果某一趟遍历的时候没有进行交换，那么就说明已经是有序的了，就不再进行下一趟排序了。

    public static void function2(int[] arr) {
        //设置一个默认的标志位，如果有排序则置位true，如果没有排序则为false；
        Boolean flag;
        for (int i = arr.length - 1; i > 0; i--) {
            //注意要在每次循环的时候都要置位false，才能判断当前次是否有排序。
            flag = false;
            for (int j = 0; j < i; j++) {
                if (arr[j] > arr[j + 1]) {
                    int temp;
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                    flag = true;
                }
            }
            if (flag == false) {
                break;
            }
        }
    }

    public static void printArray(int[] arr) {
        for (int num : arr) {
            System.out.print(num + " ");
        }
        System.out.println();
    }


}
